/*
 * Quadruples.h
 *
 *  Created on: Nov 25, 2011
 *      Author: bkoziak
 */

#ifndef QUADRUPLES_H_
#define QUADRUPLES_H_
#include <vector>
#include <string>
#include "Quadruple.h"
#include "Symbol.h"
#include "TablicaSymboli.h"

using namespace std;

typedef vector<Quadruple*> QuadrupleVector;
typedef vector<string> StringVector;
typedef vector<Symbol*> WektorSymboli;

class Quadruples {
public:
	static Quadruples* getInstance();
	void skok(Quadruple* q);
	Symbol* wstaw(Quadruple* q1);
	void przypisz(Symbol* s1, Symbol* s2);
	Symbol* dodaj(int znak, Symbol* s1, Symbol* s2);
	Symbol* pomnoz(int znak, Symbol* s1, Symbol* s2);
	Symbol* porownaj(int op, Symbol* s1, Symbol* s2);
	Symbol::TYP_ZMIENNEJ getTypZmiennej();
	Symbol* realToInt(Symbol* arg);
	Symbol* intToReal(Symbol* arg);
	string stworzLabelDlaWhile();
	string getLabelDlaWhile();
	string stworzLabelDlaIf();
	string getLabelDlaIf();
	string stworzLabelDlaThen();
	string getLabelDlaThen();
	string getNastepnyLabel();
	string getAsm();
	Symbol* wywolajJesliWbudowana(Symbol* funkcja, WektorSymboli argumenty);
	Symbol* wywolaj(Symbol* funkcja, WektorSymboli parametry,
			WektorSymboli argumenty);
	void rozpocznijFunkcje(Symbol* funkcja);
	void zakonczFunkcje();
	Symbol* ustawArgument(Symbol* parametr, Symbol* argument);
	Symbol* stalaDoZmiennej(Symbol* stala, Symbol::TYP_ZMIENNEJ typDocelowy);
	Symbol* dopasujTypy(Symbol* parametr, Symbol* argument);
	virtual ~Quadruples();

private:
	Quadruples();
	static Quadruples* instance;
	int numerAktualnegoLabela;
	QuadrupleVector quadrupleVector;
	StringVector labeleDlaWhile;
	StringVector labeleDlaIf;
	StringVector labeleDlaThen;
};

#endif /* QUADRUPLES_H_ */
